#!/usr/bin/python3  # 标准linux下的路径
# -*- coding: UTF-8 -*-    # 指定不同的编码，默认为utf-8，cp-1252


# import要在top上
import keyword
import sys
import re
import time

# 一切从helloworld开始
print("hello")  # helloworld

# 保留字
print(keyword.kwlist)

def copy_on_write():
    hello

def term():
    """
    hello
    >>> term
    >>> copy_on_write()
    >>> co
    """
    print()

#
# 多行注释
'''
多行注释
'''
"""
多行注释
"""

# 缩进代表代码块，不用{}
if True:
    print("true")
else:
    print("false")

# 缩进不一致会导致运行错误

# 多行语句，一般一条写完，但是如果没有可以用\换行
item_one = 1
item_two = 2
item_three = 3
total = item_one + \
        item_two + \
        item_three
print(total)

# 1. 四种数据类型， int bool float complex
# bool是 True False
# float 1.23 3E-2
# complex 1+2j  1.1+2.2j
# python中的单引号和双引号完全相同，三引号为一个多行字符串传
# 转义符 \  加r可以不反生转义
# String类型自动级联  "this""is""string" --> this is string
# +号连接字符串，*运算符重复
# 字符串两种索引方式，从左到右0开始，从右往左-1
# 字符串不能改变
# 没有单独的字符类型，一个字符就是长度为1的字符串
# 截取语法：变量[头下标:尾下标]

str = "hello"
print(str)
print(str[0:-1])  # 输出 hell -1为最末尾的下标
print(str[0])  # 输出h
print(str * 2)  # 输出2次
print(str + " world")
print("\n" + str)  # \转义
print(r"\n" + str)  # 在字符串前加r避免转义输出\nhello

# 空行表示函数间方法或者类的方法表示，表示一段新代码的开始
# 便于维护，不写空行也没事

# input("\n\n按下entre键后退出。")

# 同一行显示多条语句，可以用;隔开
str = "hello1";
sys.stdout.write(str + '\n')

# 多个语句可以语法开头，:结束，下面写正文
if True:
    print("zeng")
elif False:
    print("jian")
else:
    print("other")

# print默认换行，如果想不换行，在变量末尾加上end=""
x = "a"
y = "b"
print(x)
print(y)

print(x, end="")  # end是表示以什么结尾
print(y, end="\n")

# 导入语句
# import导包  from...import 导入模块
# 各个模块用,隔开

print("-----------")
a = b = c = 1
a, b, c = 1, 2, 3
print(a)
print(b)
print(c)
print(a + b + c)
# 用type来查看变量类型
print(type(a))
a, b, c, d = 20, 5.5, True, 4 + 3j
print(type(a), type(b), type(c), type(d))

# isinstance来判断类型
e = isinstance(a, int)
print(e)

# 列表List[] 元素类型可以被改变
list = [1, 2, 3, 4, True, False, 0.0, 1.2]
print(list)
list = [[], [], [1, 3, 4]]
print(list[0])
print("-------------")

# 元组 tuple ()可以被索引不可以被改变
tupe = ("abcd", 123, 4565, 7.8, 13)
tupe2 = (16, 6, 19)
print(tupe)
print(tupe[0:-1])
print(tupe[0])
print(tupe * 2)
print(tupe + tupe2)  # 元祖连接

# set集合，无序，重复元素会被去除
print("------")
student = {"tom", "jim", "tom", "jack"}
print(student)
if "jack" in student:
    print(True)
else:
    print(False)

# 集合运算
a = set("abcdefgg")
b = set("aalalabb")
print("------")
# print(a)
# print(b)
print(a - b)  # 差集
print(a | b)  # 并集
print(a & b)  # 交集
print(a ^ b)  # 同时不存在的元素

# 字典，无序的对象集合，key value存储，类似于json
print("----")
dict = {}
dict["one"] = 2
dict["two"] = 16.5
print(dict)
print(dict["one"])
print(dict["two"])
print(dict.keys())
print(dict.values())
# 三种方式构造dict
print("-------")

# TODO 这里有问题
hello = {}
# hello([('Runoob', 1), ('Google', 2), ('Taobao', 3)])
# hello(runbbo=1, goo=2, tabo=3)
print(hello)

# 转换函数
# http://www.runoob.com/python3/python3-data-type.html


# 运算符
# //这个返回商的部分，否则 / 返回的都是float
# == != 这些一样
# += -= 这些一样 不一样的是 **=幂等 和 //= 取整
print("------")
c = 2
b = 3
c **= b  # 就是 c= c**b  c的b次方
print(c)


#  位运算相同  ~表示按位取反
# 逻辑运算符
# x and y   x or y not x
# in 序列中找   not in 序列中没有
# 身份运算 is  is not
# is 和== 有区别，is用于判断两个变量引用是否为一个，==表示两个值是否相等，类似于== 和equals的区别

# 函数代码块用def定义
def hello():
    print("hello world")
    return


hello()


def hello(str):
    print(str)
    return


hello("yixi")
